home *** CD-ROM | disk | FTP | other *** search
/ Programming a Multiplayer FPS in DirectX / Programming a Multiplayer FPS in DirectX (Companion CD).iso / DirectX / dxsdk_oct2004.exe / dxsdk.exe / Utilities / MView / mview.h < prev    next >
Encoding:
C/C++ Source or Header  |  2004-09-30  |  19.8 KB  |  737 lines

  1. #pragma once
  2.  
  3. #ifndef __MVIEW_H__
  4. #define __MVIEW_H__
  5.  
  6. /*//////////////////////////////////////////////////////////////////////////////
  7. //
  8. // File: mview.h
  9. //
  10. // Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
  11. //
  12. //
  13. //////////////////////////////////////////////////////////////////////////////*/
  14.  
  15. class TrivialData;
  16. struct SDrawElement;
  17. struct SFrame;
  18.  
  19. const DWORD x_typeTri = 3;
  20. const DWORD x_typeQuad = 4;
  21.  
  22. enum METHOD {
  23.     D3DNONINDEXED,
  24.     D3DINDEXED,
  25.     SOFTWARE,
  26.     NONE
  27. };
  28.  
  29. const int x_cpsnTexCoords = 8;
  30.  
  31. struct SMeshContainer //: D3DXMESHCONTAINER
  32. {
  33.     LPTSTR                  Name;
  34.  
  35.     D3DXMESHDATA            MeshData;
  36.  
  37.     //LPD3DXMATERIAL        pMaterials;
  38.     LPD3DXMATERIAL          rgMaterials;
  39.     LPD3DXEFFECTINSTANCE    pEffects;
  40.  
  41.     DWORD                   NumMaterials;
  42.     //DWORD                  *pAdjacency;
  43.     DWORD *rgdwAdjacency;
  44.  
  45.     LPD3DXSKININFO          pSkinInfo;
  46.  
  47.     //_D3DXMESHCONTAINER     *pNextMeshContainer;
  48.     SMeshContainer         *pNextMeshContainer;
  49.  
  50.  
  51.     ID3DXBaseMesh *ptmDrawMesh;
  52.     LPD3DXMESH              pMesh;
  53.     LPD3DXPMESH             pPMMesh;
  54.     LPD3DXPATCHMESH         pPatchMesh;
  55.  
  56.     // arrays of strips - if present, then m_cAttributeGroups sized
  57.     LPDIRECT3DINDEXBUFFER9 *m_rgpStrips;
  58.     DWORD *m_rgcStripIndices;
  59.     DWORD **m_rgrgcStripCounts;
  60.     DWORD *m_rgcStrips;
  61.  
  62.     ID3DXSPMesh *pSimpMesh;
  63.  
  64.     ID3DXMesh *pMeshToTesselate;
  65.     ID3DXMesh *pSWTesselatedMesh;
  66.  
  67.     DWORD *rgdwAdjacencyTesselate;
  68.  
  69.     D3DXATTRIBUTERANGE *m_rgaeAttributeTable;
  70.     DWORD m_caeAttributeTable;
  71.  
  72.     LPD3DXEFFECT *m_rgpfxAttributes;
  73.     SEffectInfo *m_rgEffectInfo;
  74.     
  75.     DWORD m_cAttributeGroups;
  76.  
  77.     DWORD iAttrSplit;
  78.  
  79.     BOOL bPMMeshMode;
  80.     BOOL bSimplifyMode;
  81.     BOOL bTesselateMode;
  82.     BOOL bNPatchMode;
  83.  
  84.     ULONG m_cNumVertices;
  85.     ULONG m_cMaxVerticesSoft;
  86.     ULONG m_cMinVerticesSoft;
  87.  
  88.     // used for looking at strips
  89.     CStripOutline m_soStrips;
  90.     CAdjacencyOutline m_aoAdjacency;
  91.     CEdgeOutline m_eoEdges;
  92.     CShowNormals m_snNormals;
  93.     CShowNormals *m_rgpsnTexCoords[x_cpsnTexCoords];
  94.     CNPatchOutline m_npoNPatchOutline;
  95.  
  96.     D3DXVECTOR3 m_vBoundingBoxMin;
  97.     D3DXVECTOR3 m_vBoundingBoxMax;
  98.  
  99.     // Skin info
  100.     LPD3DXMESH  m_pSkinnedMesh;         // stores the mesh after skinning has been applied
  101.     DWORD m_dwSkinningType;
  102.     LPD3DXMESH  m_pOrigMesh;
  103.     D3DXMATRIX *pBoneOffsetMatrices;
  104.     D3DXMATRIX** m_pBoneMatrix;
  105.     DWORD m_numBoneComb;
  106.     DWORD m_maxFaceInfl;
  107.     LPD3DXBUFFER m_pBoneCombinationBuf;
  108.     METHOD  m_Method;
  109.     BOOL  m_bOverrideMethod;
  110.     DWORD m_iPaletteSize;
  111.  
  112.     UINT cTesselateLevel;
  113.  
  114.  
  115.     // variables used during save to store off some information that normally is in the D3DXMESHCONTAINER data section
  116.     //    but cannot be there during the save call because it would save the wrong data
  117.     LPD3DXMESH m_pMeshBackup;
  118.     DWORD     *m_rgdwAdjacencyBackup;
  119.  
  120.  
  121.     SMeshContainer()
  122.         :ptmDrawMesh(NULL),
  123.             pPMMesh(NULL),
  124.             m_rgpStrips(NULL),
  125.             m_rgcStripIndices(0),
  126.             pSimpMesh(NULL),
  127.             pMeshToTesselate(NULL),
  128.             pSWTesselatedMesh(NULL),
  129.             pMesh(NULL),
  130.             pPatchMesh(NULL),
  131.             rgdwAdjacency(NULL),
  132.             rgdwAdjacencyTesselate(NULL),
  133.             m_rgaeAttributeTable(NULL),
  134.             m_caeAttributeTable(0),
  135.             m_rgpfxAttributes(NULL),
  136.             m_rgEffectInfo(NULL),
  137.             rgMaterials(NULL),
  138.             pEffects(NULL),
  139.             m_cAttributeGroups(0),
  140.             iAttrSplit(0),
  141.             bPMMeshMode(FALSE),
  142.             bSimplifyMode(FALSE),
  143.             bTesselateMode(FALSE),
  144.             bNPatchMode(FALSE),
  145.             m_cNumVertices(0),
  146.             m_cMaxVerticesSoft(0),
  147.             m_cMinVerticesSoft(0),
  148.             m_pSkinnedMesh(NULL),
  149.             m_dwSkinningType(D3DXST_UNSKINNED),
  150.             m_pOrigMesh(NULL),
  151.             pBoneOffsetMatrices(NULL),
  152.             m_pBoneMatrix(NULL),
  153.             m_numBoneComb(0),
  154.             m_maxFaceInfl(0),
  155.             m_pBoneCombinationBuf(NULL),
  156.             m_Method(NONE),
  157.             m_bOverrideMethod(FALSE),
  158.             m_iPaletteSize(0),
  159.             cTesselateLevel(1),
  160.             m_pMeshBackup(NULL),
  161.             m_rgdwAdjacencyBackup(NULL)
  162.     {
  163.         memset(this, 0, sizeof(D3DXMESHCONTAINER));
  164.  
  165.         // initialize mesh data structure, only used for saving
  166.         MeshData.Type = D3DXMESHTYPE_MESH;
  167.         MeshData.pPMesh = 0;
  168.  
  169.         memset(m_rgpsnTexCoords,0, sizeof(CShowNormals*)*x_cpsnTexCoords);
  170.     }
  171.  
  172.     ~SMeshContainer()
  173.     {
  174.         DWORD cBones, iBone;
  175.  
  176.         for (DWORD iMaterial = 0; m_rgpfxAttributes != NULL && iMaterial < NumMaterials; iMaterial++)
  177.         {
  178.             GXRELEASE(m_rgpfxAttributes[iMaterial]);
  179.         }
  180.  
  181.         for (DWORD iMaterial = 0; rgMaterials != NULL && iMaterial < NumMaterials; iMaterial++)
  182.         {
  183.             delete []rgMaterials[iMaterial].pTextureFilename;
  184.         }
  185.  
  186.         for (DWORD iMaterial = 0; pEffects != NULL && iMaterial < NumMaterials; iMaterial++)
  187.         {
  188.             delete []pEffects[iMaterial].pEffectFilename;
  189.             for (DWORD iDefault = 0; iDefault < pEffects[iMaterial].NumDefaults; iDefault++)
  190.             {
  191.                 delete []pEffects[iMaterial].pDefaults[iDefault].pParamName;
  192.                 delete []pEffects[iMaterial].pDefaults[iDefault].pValue;
  193.             }
  194.  
  195.             delete []pEffects[iMaterial].pDefaults;
  196.         }
  197.  
  198.         for (DWORD iMaterial = 0; (m_rgpStrips != NULL) && iMaterial < m_cAttributeGroups; iMaterial++)
  199.         {
  200.             GXRELEASE(m_rgpStrips[iMaterial]);
  201.         }
  202.  
  203.         // delete any allocated tex coord
  204.         for (DWORD iTexCoord = 0; iTexCoord < x_cpsnTexCoords; iTexCoord++)
  205.         {
  206.             delete m_rgpsnTexCoords[iTexCoord];
  207.             m_rgpsnTexCoords[iTexCoord] = NULL;
  208.         }
  209.  
  210.         delete []m_rgpStrips;
  211.         delete []m_rgcStripIndices;
  212.  
  213.         delete []pBoneOffsetMatrices;
  214.  
  215.         GXRELEASE(ptmDrawMesh);
  216.         GXRELEASE(pMesh);
  217.         GXRELEASE(pPatchMesh);
  218.         GXRELEASE(pPMMesh);
  219.         GXRELEASE(pSimpMesh);
  220.         GXRELEASE(m_pOrigMesh);
  221.         GXRELEASE(pMeshToTesselate);
  222.         GXRELEASE(pSWTesselatedMesh);
  223.         GXRELEASE(pSkinInfo);
  224.         GXRELEASE(m_pSkinnedMesh);
  225.         GXRELEASE(m_pBoneCombinationBuf);
  226.  
  227.         delete [] m_pBoneMatrix;
  228.  
  229.         delete []rgdwAdjacency;
  230.         delete []rgdwAdjacencyTesselate;
  231.  
  232.         delete []rgMaterials;
  233.         delete []m_rgEffectInfo;
  234.         delete []pEffects;
  235.         delete []m_rgpfxAttributes;
  236.         delete []m_rgaeAttributeTable;
  237.  
  238.         delete []Name;
  239.  
  240.         delete []m_rgdwAdjacencyBackup;
  241.         GXRELEASE(m_pMeshBackup);
  242.  
  243.         // UNDONE UNDONE - once frame destroy used, remove this
  244.         delete (SMeshContainer*)pNextMeshContainer;
  245.     }
  246.  
  247.     HRESULT UpdateViews(SDrawElement *pde);
  248.     HRESULT UpdateSkinInfo();
  249. };
  250.  
  251. struct SFrame //: D3DXFRAME --- NOTE: SFrame data members overlap with D3DXFRAME!!
  252. {
  253.     //LPTSTR                  Name;
  254.     char *szName;
  255.     //D3DXMATRIX              TransformationMatrix;
  256.     D3DXMATRIX matRot;
  257.  
  258.     //LPD3DXMESHCONTAINER     pMeshContainer;
  259.     SMeshContainer *pmcMesh;
  260.  
  261.     //_D3DXFRAME             *pFrameSibling;
  262.     SFrame *pframeSibling;
  263.     //_D3DXFRAME             *pFrameFirstChild;
  264.     SFrame *pframeFirstChild;
  265.  
  266.     D3DXMATRIX matTrans;
  267.     D3DXMATRIX matRotOrig;
  268.     D3DXMATRIX matCombined;
  269.  
  270.  
  271.     HTREEITEM m_hTreeHandle;
  272.  
  273.     SFrame()
  274.         :   pmcMesh(NULL),
  275.             pframeSibling(NULL),
  276.             pframeFirstChild(NULL),
  277.             szName(NULL),
  278.             m_hTreeHandle(NULL)
  279.     {
  280.         D3DXMatrixIdentity(&matRot);
  281.         D3DXMatrixIdentity(&matRotOrig);
  282.         D3DXMatrixIdentity(&matTrans);
  283.     }
  284.  
  285.     ~SFrame()
  286.     {
  287.         delete []szName;
  288.         delete pmcMesh;        
  289.  
  290.         SFrame *pToDelete;
  291.  
  292.         // non-recursive delete
  293.         while (NULL != pframeFirstChild)
  294.         {
  295.             pToDelete = pframeFirstChild;
  296.             pframeFirstChild = pToDelete->pframeFirstChild;
  297.             pToDelete->pframeFirstChild = NULL;
  298.  
  299.             delete pToDelete;
  300.         }
  301.  
  302.         // non-recursive delete
  303.         while (NULL != pframeSibling)
  304.         {
  305.             pToDelete = pframeSibling;
  306.             pframeSibling = pToDelete->pframeSibling;
  307.             pToDelete->pframeSibling = NULL;
  308.  
  309.             delete pToDelete;
  310.         }
  311.     }
  312.  
  313.     SFrame *FindFrame(char *szFrame)
  314.     {
  315.         SFrame *pframe;
  316.  
  317.         if ((szName != NULL) && (strcmp(szName, szFrame) == 0))
  318.             return this;
  319.  
  320.         if (pframeFirstChild != NULL)
  321.         {
  322.             pframe = pframeFirstChild->FindFrame(szFrame);
  323.             if (pframe != NULL)
  324.                 return pframe;
  325.         }
  326.  
  327.         if (pframeSibling != NULL)
  328.         {
  329.             pframe = pframeSibling->FindFrame(szFrame);
  330.             if (pframe != NULL)
  331.                 return pframe;
  332.         }
  333.  
  334.         return NULL;
  335.     }
  336.  
  337.     BOOL PMeshPresent()
  338.     {
  339.         BOOL bResult;
  340.  
  341.         SMeshContainer *pmc = pmcMesh;
  342.         while (pmc != NULL)
  343.         {
  344.             if (pmc->pPMMesh != NULL)
  345.                 return TRUE;
  346.  
  347.             pmc = pmc->pNextMeshContainer;
  348.         }
  349.  
  350.         if (pframeFirstChild != NULL)
  351.         {
  352.             bResult = pframeFirstChild->PMeshPresent();
  353.             if (bResult)
  354.                 return bResult;
  355.         }
  356.  
  357.         if (pframeSibling != NULL)
  358.         {
  359.             bResult = pframeSibling->PMeshPresent();
  360.             if (bResult)
  361.                 return bResult;
  362.         }
  363.  
  364.         return FALSE;
  365.     }
  366.  
  367.     void ResetMatrix()
  368.     {
  369.         matRot = matRotOrig;
  370.         D3DXMatrixIdentity(&matTrans);        
  371.  
  372.         if (pframeFirstChild != NULL)
  373.         {
  374.             pframeFirstChild->ResetMatrix();
  375.         }
  376.  
  377.         if (pframeSibling != NULL)
  378.         {
  379.             pframeSibling->ResetMatrix();
  380.         }
  381.     }
  382.  
  383.     void AddFrame(SFrame *pframe)
  384.     {
  385.         GXASSERT(pframe != NULL);
  386.  
  387.         if (pframeFirstChild == NULL)
  388.         {
  389.             pframeFirstChild = pframe;
  390.         }
  391.         else
  392.         {
  393.             pframe->pframeSibling = pframeFirstChild->pframeSibling;
  394.             pframeFirstChild->pframeSibling = pframe;
  395.         }
  396.     }
  397.  
  398.     void AddMesh(SMeshContainer *pmc)
  399.     {
  400.         GXASSERT(pmc != NULL);
  401.  
  402.         pmc->pNextMeshContainer = pmcMesh;
  403.         pmcMesh = (SMeshContainer*)pmc;
  404.     }
  405. };
  406.  
  407. struct SDrawElement
  408. {
  409.     SFrame *pframeRoot;
  410.  
  411.     D3DXVECTOR3 vCenter;
  412.     float fRadius;
  413.  
  414.     // name of element for selection purposes
  415.     char *szName;
  416.  
  417.     // animation list
  418.     LPD3DXANIMATIONCONTROLLER m_pAnimMixer;
  419.     DWORD m_iSelectedAnimSet;
  420.  
  421.     // next element in list
  422.     SDrawElement *pdeNext;
  423.  
  424.     float fCurTime;
  425.     float fMaxTime;
  426.     DWORD dwTexCoordsCalculated;
  427.  
  428.     BOOL bSkinnedMeshInHeirarchy;
  429.  
  430.         SDrawElement()
  431.             :vCenter(0.0,0.0,0.0),
  432.                 fRadius(1.0),
  433.                 szName(NULL),
  434.                 pframeRoot(NULL),
  435.                 m_pAnimMixer(NULL),
  436.                 m_iSelectedAnimSet(0),
  437.                 pdeNext(NULL),
  438.                 dwTexCoordsCalculated(0),
  439.                 bSkinnedMeshInHeirarchy(FALSE)
  440.     {
  441.     }
  442.     
  443.     ~SDrawElement()
  444.     {
  445.         delete pframeRoot;
  446.         delete pdeNext;
  447.  
  448.         delete []szName;
  449.  
  450.         GXRELEASE(m_pAnimMixer);
  451.     }
  452.  
  453.     SFrame *FindFrame(char *szName)
  454.     {
  455.         if (pframeRoot == NULL)
  456.             return NULL;
  457.         else
  458.             return pframeRoot->FindFrame(szName);
  459.     }
  460. };
  461.  
  462. HRESULT CalculateBoundingSphere(SDrawElement *pdeCur);
  463.  
  464. struct STextureCache
  465. {
  466.     char                    *szFilename;
  467.     LPDIRECT3DBASETEXTURE9  pTexture;
  468.  
  469.     STextureCache           *pNext;
  470.  
  471.     STextureCache()
  472.         :szFilename(NULL), pTexture(NULL), pNext(NULL) {}
  473.  
  474.     ~STextureCache()
  475.     {
  476.         delete []szFilename;
  477.         GXRELEASE(pTexture);
  478.  
  479.         delete pNext;
  480.     }
  481. };
  482.  
  483. const DWORD x_iDefaultSkinningPaletteSize = 28;
  484.  
  485. class TrivialData : public CD3DXApplication
  486. {
  487.     friend LRESULT CALLBACK DlgProcCreateText(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
  488. public:
  489.     TrivialData( );
  490.     ~TrivialData( );
  491.  
  492.     void InitializeHelper();
  493.  
  494.     // Don't hurt anything, just stop drawing
  495.     void PauseDrawing( );
  496.     void RestartDrawing( );
  497.  
  498.     // D3DX App functions
  499.     virtual BOOL AreCapsSufficient(D3DCAPS9 *pCaps, DWORD dwBehaviorFlags);
  500.  
  501.     virtual LRESULT OnMessage(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
  502.     static LRESULT WINAPI WndProcCallback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
  503.  
  504.     virtual HRESULT OnUpdate(float fSecsPerFrame);
  505.     HRESULT UpdateAnimation(SDrawElement *pde, float fSecsPerFrame);
  506.  
  507.  
  508.     virtual HRESULT OnDraw(float fAspect);
  509.     HRESULT DrawSubset(LPD3DXBASEMESH pMesh, LPD3DXEFFECT pEffect, SEffectInfo *pEffectInfo, DWORD ipattr, SMeshContainer *pmcMesh, BOOL bSelected, D3DXMATRIX *rgmIndexedMatrices, DWORD cIndexedMatrices);
  510.     HRESULT DrawMeshContainer(SMeshContainer *pmcMesh, D3DXMATRIX *pmatWorld);
  511.     HRESULT DrawFrames(SFrame *pframeCur, UINT &cTriangles, UINT &cVertices);
  512.     HRESULT UpdateFrames(SFrame *pframeCur, D3DXMATRIX &matCur);
  513.  
  514.     HRESULT FindBones(SFrame *pframeCur, SDrawElement *pde);
  515.  
  516.     //virtual HRESULT OnCreateSurfaces();
  517.     virtual HRESULT OnCreateDevice();
  518.     virtual HRESULT OnResetDevice();
  519.     virtual HRESULT OnLostDevice();
  520.     virtual HRESULT OnDestroyDevice();
  521.  
  522.     HRESULT RestoreSurfaces( );
  523.     HRESULT ReloadTextures( );
  524.     HRESULT ReleaseTextures( );
  525.  
  526.     HRESULT LoadNewMesh( );
  527.     HRESULT LoadMesh( TCHAR* file, BOOL bFlattenHierarchy );
  528.     HRESULT LoadMeshHierarchyFromFile(char *szFilename);
  529.     HRESULT SaveMeshHierarchyToFile(SDrawElement *pde, SFrame *pframeRoot, char *szFilename, DWORD xFormat);
  530.     HRESULT LoadNewProgressiveMesh( );
  531.     HRESULT SaveMesh( );
  532.     HRESULT SavePMesh( );  //No longer needed with save hierarchy supporting pmeshes
  533.     HRESULT SetProjectionMatrix();
  534.  
  535.     HRESULT GeneratePM(void);
  536.  
  537.     HRESULT NewTexture(char *szTexName, LPDIRECT3DTEXTURE9 *pptex);
  538.     HRESULT NewCubeTexture(char *szTexName, LPDIRECT3DCUBETEXTURE9 *pptex);
  539.  
  540.     HRESULT ConvertMeshToSimplify();
  541.  
  542.     void NormalizeNormals();
  543.     HRESULT RemoveBackToBackTris();
  544.     HRESULT RemoveAllMeshesExceptSelectedFromFrame(SFrame *pframeCur);
  545.     HRESULT RemoveAllMeshesExceptSelected();
  546.  
  547.     HRESULT SimulateCacheStuff();
  548.     HRESULT DisplayCacheBehavior();
  549.     HRESULT BuildCacheHistogram();
  550.  
  551.  
  552.     void ToggleCullMode();
  553.     void ToggleLightMode();
  554.     void ToggleEdgeMode();
  555.     void ToggleSolidMode();
  556.     void ToggleNPatchEdgeMode();
  557.     void ToggleNoSelectionMode();
  558.     void ToggleFaceSelectionMode();
  559.     void ToggleVertexSelectionMode();
  560.     void ToggleMeshSelectionMode();
  561.     void ToggleShowMeshSelectionMode();
  562.     void ToggleStripMode();
  563.     void ToggleAdjacencyMode();
  564.     void ToggleCreaseMode();
  565.     void ToggleNormalsMode();
  566.     void ToggleShowTexCoord(DWORD iTexCoord);
  567.     void ToggleWireframeMode();
  568.     void ChangeSkinningMode(METHOD method);
  569.     void ToggleTreeView();
  570.     void ChangeAnimMode(BOOL bPause);
  571.     void TogglePlaybackSpeed();
  572.  
  573.  
  574.     void ToggleTextureMode();
  575.  
  576.     void AdjustScrollbar();
  577.     void SetNumVertices(int cVerticesChange, bool bAbsolute);
  578.     void SetNumFaces(int cFacesChange, bool bAbsolute);
  579.     void ConvertSelectedMesh(DWORD dwOptions, LPD3DVERTEXELEMENT9 pDecl);
  580.  
  581.     void SetSoftMinLOD();
  582.     void SetSoftMaxLOD();
  583.     void ResetSoftMinLOD();
  584.     void ResetSoftMaxLOD();
  585.     void TrimPMeshToSoftLimits();
  586.     void SnapshotSelected();
  587.     void MergeMeshes();
  588.  
  589.     HRESULT Tesselate(SMeshContainer *pmc, BOOL bSkipAdjacencyAndEdges);
  590.     HRESULT TesselateFrame(SFrame *pframe);
  591.     //void FixNPatchCreases();
  592.     HRESULT SplitMesh();
  593.     HRESULT ComputeSecondaryNormals();
  594.  
  595.     HRESULT WeldVertices();
  596.     HRESULT TestSimplify();
  597.  
  598. #if 0
  599.     HRESULT ApplyEffectsToMesh(SMeshContainer *pmcMesh);
  600. #endif
  601.  
  602. public:
  603. //private:
  604.     HRESULT CreateText();
  605.     HRESULT CreatePolygon();
  606.     HRESULT CreateBox();
  607.     HRESULT CreateCylinder();
  608.     HRESULT CreateTorus();
  609.     HRESULT CreateTeapot();
  610.     HRESULT CreateSphere();
  611.     HRESULT CreateCone();
  612.  
  613.     HRESULT SelectTextFont();
  614.  
  615.     void Optimize(DWORD dwFlags);
  616.     void CleanMesh();
  617.  
  618.     void ValidateMesh();
  619.     void ComputeNormals();
  620.  
  621.     void Displace();
  622.  
  623.     HRESULT UpdateAnimationsMenu();
  624.     void SwitchToAnimationSet(UINT iAnimSet);
  625.     void AddAnimation();
  626.  
  627.     HRESULT UpdateMeshMenu();
  628.     HRESULT UpdateTreeInfo(SFrame *pframeCur, HTREEITEM htreeParent);
  629.  
  630.     HRESULT SelectFrame(SFrame *pframeNew, SMeshContainer *pmcMesh);
  631.     HRESULT SelectFace(DWORD dwFace);
  632.     HRESULT SelectVertex(DWORD dwVertexs);
  633.     void SelectDrawElement(SDrawElement *pdeNew);
  634.     //void SwitchToMeshID(UINT iMeshID);
  635.     void SelectionChange(DWORD dwX, DWORD dwY);
  636.     void UpdateSelectionInfo();
  637.     void SetupMenu();
  638.  
  639.     HRESULT AddMeshToDrawList(char *szName, LPD3DXMESH ptmMesh, LPD3DXPMESH ptmPMesh, LPD3DXBUFFER pbufAdjacency, LPD3DXBUFFER pbufMaterials, LPD3DXBUFFER pbufEffectInstances, UINT cMaterials);
  640.     HRESULT DeleteSelectedMesh();
  641.  
  642.     // Objects created by Initialize and retained
  643.     HMENU m_hMenu;
  644.     HMENU m_hMeshMenu;
  645.     HMENU m_hAnimationsMenu;
  646.  
  647.     HRESULT UpdateFrameRate(float fSecsPerFrame);
  648.     HRESULT UpdateStatusBar(DWORD cTotalTriangles, DWORD cTriangles, DWORD cVertices);
  649.  
  650.  
  651.     // Transient objects that get affected by PrepareToDraw
  652. public:
  653.     BOOL m_bHWVertexShaders;
  654.     BOOL m_bHWNPatches;
  655.     BOOL m_bSoftwareVP;
  656.  
  657.     BOOL m_bTextureMode;
  658.     BOOL m_bEdgeMode;
  659.     BOOL m_bNPatchEdgeMode;
  660.     BOOL m_bStripMode;
  661.     BOOL m_bAdjacencyMode;
  662.     BOOL m_bCreaseMode;
  663.     BOOL m_bNormalsMode;
  664.     BOOL m_bWireframeMode;
  665.     BOOL m_bFaceSelectionMode;
  666.     BOOL m_bVertexSelectionMode;
  667.     BOOL m_bShowMeshSelectionMode;
  668.     BOOL m_bAnimPaused;
  669.     BOOL m_bLighting;
  670.     BOOL m_bUpdatedNormalDuringMouseMove;
  671.     DWORD m_dwTexCoordsShown;       // bit field for currently visible tex coords 0 - texcoord 0, 1 - 1, etc.
  672.  
  673.     DWORD m_dwCullMode;
  674.  
  675.     DWORD m_dwFVF;
  676.  
  677.     // member variables for frame rate display
  678.     HFONT m_hFontText;
  679.     DWORD m_rgbFontColor;
  680.     char  m_szText[256];
  681.     float m_fExtrusion;
  682.     float m_fDeviation;
  683.     SIZE m_sizeClient;
  684.  
  685.     D3DXVECTOR2 m_vCurMousePosition;       // previous mouse position    
  686.     GXArcBall m_abArcBall;
  687.  
  688.     DWORD m_dwFaceSelected;
  689.     DWORD m_dwFaceSelectedAttr;
  690.     DWORD m_dwVertexSelected;
  691.     SMeshContainer *m_pmcSelectedMesh;
  692.     SFrame *m_pframeSelected;
  693.     SDrawElement *m_pdeSelected;
  694.     SDrawElement *m_pdeHead;
  695.  
  696.     LPD3DXEFFECT m_pfxFaceSelect;
  697.     LPD3DXEFFECT m_pfxVertSelect;
  698.     LPD3DXEFFECT m_pfxShowNormals;
  699.     LPD3DXEFFECT m_pfxSkinnedAdjacency;
  700.  
  701.     CFrameView *m_pfvTreeView;
  702.     STextureCache *m_ptcTextureCacheHead;
  703.  
  704.     PVOID pvDialogData;
  705.  
  706.     DWORD m_maxFaceInflHW;
  707.     METHOD m_method;
  708.     DWORD   m_iPaletteSize;
  709.  
  710.     HWND m_hwndStatus;
  711.     HWND m_hwndToolbar;
  712.  
  713.     BOOL m_bDisableHWNPatches;
  714.     BOOL m_bForceSoftwareMode;
  715.     BOOL m_bForceRefRast;
  716.     BOOL m_bInitialFilename;
  717.     char m_szInitialFilename[256];
  718.  
  719.     FLOAT m_fTicksPerSecond;
  720.  
  721.     FLOAT m_fFramesPerSecCur;
  722.     FLOAT m_fFramesPerSec;
  723.     FLOAT m_fLastUpdateTime;
  724.     FLOAT m_fTime;
  725.  
  726.     CShowArcball m_ShowArcball;
  727.  
  728.     // temporary memory for use at Draw time
  729.     D3DXMATRIX m_mMatrices[x_iDefaultSkinningPaletteSize];
  730. };
  731.  
  732. const DWORD x_rgStatusBarSizes[5] = {90, 60, 70, 60, 80};//{280, 370, 430, 500, 560, 640};
  733. const DWORD x_cStatusBarSizes = 5;
  734. extern TrivialData *g_pData;
  735.  
  736. #endif
  737.